function Asynchronous() {
  return (
    <>
      <p>在 recoil 中，异步查询仍然是使用 selector</p>
      <p>异步查询这一块扩展了一部分 API：</p>
      <ul>
        <li>
          useRecoilValueLoadable：当一个 selector 中返回一个
          Promise（例如，在进行异步数据获取时），Recoil 会将这个 selector
          的状态设置为异步的。
          <br />
          在这种情况下，可以使用 useRecoilValueLoadable 钩子来读取这个 selector
          的值，并根据其加载状态进行不同的处理。
          <br />
          useRecoilValueLoadable 钩子返回一个 Loadable 对象，这个对象有一个
          state 属性和一个 contents 属性。
          <br />
          <ul>
            <li>
              state 属性表示当前的加载状态，它有三个可能的值：
              <ul>
                <li>
                  hasValue：Promise 已经解析，你可以使用 Loadable 的 getValue
                  方法来获取结果
                </li>
                <li>loading：Promise 正在等待解析</li>
                <li>
                  hasError：Promise 已经被拒绝，你可以使用 Loadable 的 getError
                  方法来获取错误
                </li>
              </ul>
            </li>
            <li>contents 属性表示 selector 的值，或者在出错时表示错误对象。</li>
          </ul>
        </li>
        <li>
          selectorFamily：用于创建参数化的 selector。一个 "参数化的 selector"
          就是一个函数，这个函数接受一个参数，并返回一个 selector。
        </li>
      </ul>
      <p>
        最后就是关于刷新这一刻，由于 selector
        的计算结果可能被缓存或执行多次。这里就会出现一个问题，那就是如何在需要的时候刷新
        selector
        <br />
        官方提供了两个方案：
      </p>
      <ul>
        <li>使用请求 id</li>
        <li>每隔一段时间刷新依赖状态</li>
      </ul>
      <p>
        在整个《学生管理系统》，介绍了所用到的 API，剩余的没有介绍到的
        API，有兴趣的同学可以自行研究。
      </p>
    </>
  );
}

export default Asynchronous;
